which命令程序的查找

[root@zbx ~]# echo  $PATH   // 输出环境变量$PATH,里面存放了命令所在的路径
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
//sbin:系统管理的命令
//bin:普通命令
//local:用户后期安装软件提供的命令

[root@zbx ~]# which  hostname
/usr/bin/hostname                  //命令hostname的程序文件存在/usr/bin目录下

[root@zbx ~]# which  ifconfig
/usr/sbin/ifconfig                  //命令ifconfig的程序文件存在/usr/sbin目录下

[root@zbx ~]# which lss
// 没有lss这个程序文件
which: no lss in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin) 


 创建目录/root/bin/,将hostname程序复制为/root/bin/myhn 

[root@zbx ~]# mkdir /root/bin              //创建执行目录(PATH变量中已经定义)

[root@zbx ~]# cp  -p  /usr/bin/hostname  /root/bin/myhn      //复制程序文件,选项-p表示保持权限

[root@zbx ~]# ls  -lh  /root/bin/myhn          //确认复制结果
-rwxr-xr-x 1 root root 23K  527  2021 /root/bin/myhn

[root@zbx ~]# which  myhn              //可以快速找到新复制的myhn程序
/root/bin/myhn

[root@zbx ~]# myhn                      //通过文件名能直接调用程序
zbx.tedu.cn


 练习:将ifconfig简化为i命令,当输入i命令的时候也能够查看本机IP

1.查询ifconfig命令对应的程序
which ifconfig

2.创建一个目录 /root/bin
mkdir /root/bin

3.复制ifconfig程序文件并改名为i
cp -p : -p 复制时候将权限和属性一起复制过来

cp -p /usr/sbin/ifconfig /root/bin/i

4.输入i命令查看ip信息 



练习:
hostname命令简化成h命令

1.寻找hostname对应的程序文件所在的位置
 which hostname 

查找结果:/usr/bin/hostname

2.复制/usr/bin/hostname程序并改名
注意:复制到环境变量包含的目录下
查看环境变量:echo $PATH
复制的时候需要将权限和属性一起进行复制 cp -p
如果/root/bin 目录不存在 需要先创建 mkdir /root/bin

 cp -p /usr/bin/hostname /root/bin/h 

3.验证,输入h命令
 h 
显示主机名

find文件查找

[root@zbx ~]# cd /                     //切换到根目录
[root@zbx /]# find                     //快速列出当前目录下所有文档

// 在根目录下查找文件名的后缀是.conf的普通文件
[root@zbx ~]# find  /  -name "*.conf" -a -type f   

// 在/boot目录下查找大于10M的文件
[root@zbx ~]# find  /boot/  -size +10M  -type f  


练习:
1.查找根目录下.repo结尾的文件
find / -name "*.repo" -type f

2.查找名称中包含repos单词的目录
find / -name "*repos*" -type d

3./boot目录下查找大于2M,小于10M的文件
find /boot -size +2M -size -10M -type f

[root@zbx ~]# find  /boot/  -size +2M -size -10M -type f   // 在/boot目录下查找文件大于2M,小于10M的文件

//在/var/log/查找超过30天未修改的文档
[root@zbx ~]# find  /var/log/  -mtime +30  
//mtime : m modify 修改  time 时间   修改时间

[root@zbx ~]# find  /var/log/  -mtime +30 -type f // 在/var/log/查找超过30天未修改的普通文件
// f:file 文件
// d:directory 文件夹/目录
// l:link 链接文件

// 在根目录下查找其他用户具有r权限的文件
// u:user 属主
// g:group 属组
// o:other 其他用户
// r:read :读权限
// w:write 写权限
// x:可执行权限
[root@zbx ~]# find / -perm -o=r -type f


[root@zbx ~]# find  /usr/bin/  -perm -u=s -type f  //查找/usr/bin/目录下属主设置s标志的文件(SUID)
// perm :permission 权限
// -u : user  用户/属主的权限
// -g : group 用户组/属组
// -o : other 其他用户

// r : read 读
// w : write 写
// x : execute 执行权限
// s : set UID 特殊权限

[root@zbx ~]# find  /run  -type d  -perm -g=s //列出/run/目录下属组权限设置了“s”标记的子目录

管道符操作

[root@zbx ~]# yum list | less  // 使yum list的显示以分页显示

[root@zbx ~]# who | wc -l // 列出登录用户数量
// who:列出所有登录用户的信息(一行信息代表一个登录的用户,只要能统计出行数就代表登录的用户数量)
// wc -l : wc 表示 "word count"(词数统计),而 -l 表示 "lines"(行)

[root@zbx ~]# useradd zhangsan
[root@zbx ~]# echo "123456" | passwd --stdin zhangsan  // 无交互修改密码
// echo : 输出
// -stdin: 标准输入 可以接收 | 前输出的内容

grep文本过滤

[root@zbx ~]# grep "root" /etc/passwd  // 在/etc/passwd文件中查找带有root单词的行


[root@zbx ~]# grep -v "root" /etc/passwd  // 在/etc/passwd文件中查找不包含root的行

[root@zbx ~]# grep -i "ROOT" /etc/passwd  // 查找带有ROOT的行(不论大写的ROOT还是小写的root)

// -v:invert 选中不匹配的行(反向匹配)
// -i:ignore 忽略大小写,查找匹配root单词的行,我希望忽略大小写去查找,
// RoOt,root,ROOT... 这些都会匹配出来
// ^ : 代表一行的开头,查找ab开头的行 ^ab 查找以#开头的行 ^#
// $ : 代表一行的结尾,查找ab结尾的行 ab$ 以hello 结尾的行 hello$
// # : 配置文件中的注释,一般是在一行开头 

// 查找/etc/selinux/config文件哪些内容被注释(内容中以#开头的行)
[root@zbx ~]# grep "^#" /etc/selinux/config



// 查找/etc/selinux/config文件哪些内容没有被注释(内容中不包含#的行)
[root@zbx ~]# grep -v "^#" /etc/selinux/config  // 输出不带#的行

// 查找/etc/selinux/config文件中有哪些空行
[root@zbx ~]# grep "^$" /etc/selinux/config   //输出空行

// 查找/etc/selinux/config文件中有哪些非空行
[root@zbx ~]# grep -v "^$" /etc/selinux/config  // 输出非空行

// 查询/etc/selinux/config非空行的内容,并且匹配非注释内容(不带有#行)
[root@zbx ~]# grep -v "^$" /etc/selinux/config | grep -v "^#" 
[root@zbx ~]# ifconfig | grep "inet " // 查看IP并显示inet值
        inet 192.168.10.223  netmask 255.255.255.0  broadcast 192.168.10.255
        inet 127.0.0.1  netmask 255.0.0.0
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
[root@zbx ~]# ls  /  | wc -l

[root@zbx ~]# echo "123456" | passwd --stdin student
[root@zbx ~]# cat /etc/passwd | grep "/bin/bash"

root:x:0:0:root:/root:/bin/bash
student:x:1000:1000::/home/student:/bin/bash
[root@zbx ~]# lscpu | grep "x86_64"
架构:                           x86_64
[root@zbx ~]# grep -v "#" /etc/selinux/config | grep -v "^$"
SELINUX=permissive
SELINUXTYPE=targeted
[root@zbx ~]# cat /etc/selinux/config | grep -v "#"

SELINUX=permissive
SELINUXTYPE=targeted


[root@zbx ~]# cat /etc/selinux/config | grep -v "#" | grep -v "^$"
SELINUX=permissive
SELINUXTYPE=targeted
练习
1.查找/etc/selinux/config 文件中被注释的内容一共有多少行
grep "^#" /etc/selinux/config | wc -l

2.查找/etc/selinux/config 文件中空行有多少行
grep "^$" /etc/selinux/config | wc -l

3.查找/etc/selinux/config 包含SELINUX(忽略大小写)单词的行有哪些
grep -i "SELINUX" /etc/selinux/config

4.查找/etc/selinux/config 没有被注释的行并且非空行一共有多少行
grep -v "^#" /etc/selinux/config | grep -v "^$" | wc -l

进程管控

进程查看

[root@zbx ~]# pstree  // 查看进程树
systemd─┬─NetworkManager───2*[{NetworkManager}]
        ├─agetty
        ├─atd
        ├─auditd─┬─sedispatch
        │        └─2*[{auditd}]
        ├─chronyd
        ├─crond
        ├─dbus-daemon
为了验证选项:执行以下操作
在虚拟机运行(目的:生成一个vim进程) 
useradd student
su - student
vim a.txt  (不要退出)
在Moba中执行 
[root@zbx ~]# pstree student  //查看student用户运行的进程
bash───vim
[root@zbx ~]# pstree -a student  // 带参数
bash
  └─vim a.txt
[root@zbx ~]# pstree -ap student  // 显示进程号
bash,4063
  └─vim,4127 a.txt
  
[root@zbx ~]# pstree -ap u    // 显示用户
[root@zbx ~]# top  // 查看进程占用的资源(动态)
/*

PID:进程标识号,这是每个进程的唯一标识符。
USER:该进程的所有者的用户名。
PR:进程优先级。该值越小,进程的优先级越高。
NI:进程的「nice」值,这是用户控制进程优先级的一个方式。该值越小,进程的优先级越高。
VIRT:进程使用的虚拟内存总量,单位是千字节 (KB)。
RES:进程使用的、未被换出的物理内存大小,单位是千字节 (KB)。
SHR:进程使用的共享内存大小,单位是千字节 (KB)。
S:进程的状态。可能的值有:
S 表示休眠 (sleeping)
R 表示运行中 (running)
T 表示停止 (traced)
Z 表示僵尸状态 (zombie)
%CPU:该进程使用的 CPU 时间百分比。
%MEM:该进程使用的物理内存百分比。
TIME+:该进程使用的总 CPU 时间,格式为 [dd-]hh:mm:ss。
COMMAND:启动进程的命令行名称。

在Linux中,一个进程的优先级与其PR(优先级)和NI(nice值)有关。PR和NI的关系如下:

PR(Priority):在Linux中,进程的优先级在内核级别是由PR值决定的。
PR值的范围是0-139,其中0-99是实时进程,100-139是用户进程。
PR值越小,优先级越高。也就是说,PR值为0的进程具有最高优先级,而PR值为139的进程具有最低优先级。

NI(Nice):Nice值是用户空间级别用于调整进程优先级的一个值,它的范围是-20(最高优先级)
到19(最低优先级)。默认情况下,进程的nice值为0。

Nice值的修改会影响到PR值,即内核级别的优先级。
具体来说,PR值是通过将nice值添加到一个基准值(通常为20)来计算的。
换句话说,PR值实际上是20 + NI(对于用户进程)。这意味着nice值越大(也就是越"nice"),
实际的PR值也就越大,进程优先级也就越低。

例如,如果一个进程的nice值为10,那么其PR值就是30(20 + 10)。
如果另一个进程的nice值为-5,那么其PR值就是15(20 - 5),所以它的优先级更高。

总的来说,一个进程的优先级是由PR值决定的,而PR值是由nice值决定的。
用户可以通过改变进程的nice值来影响其优先级

查找进程

[root@zbx ~]# pgrep vim
4127
[root@zbx ~]# pgrep -l ssh   // -l 列出进程名称
976 sshd
2034 sshd
2039 sshd

杀死进程

[root@zbx ~]# pkill -9 vim    // 通过进程名称杀进程 -9代表强制杀掉
[root@zbx ~]# kill -9 进程ID  //通过进程ID杀进程  -9代表强制杀掉  
[root@zbx ~]# sleep 5   // 暂停程序
[root@zbx ~]# sleep 5 &  // 将程序放到后台执行
[1] 4199
[root@zbx ~]# sleep 300& // & : 后台运行  sleep 300& 在后台运行sleep进程,持续300秒
[1] 4202
[root@zbx ~]# pgrep -l "slee" // 查看进程号和进程名称
4202 sleep
[root@zbx ~]# pkill -9 sleep
[1]+  已杀死               sleep 300
[root@zbx ~]# pgrep -l "slee"


// 使用kill杀进程
[root@zbx ~]# sleep 300&
[root@zbx ~]# pgrep -l "slee"
[root@zbx ~]# kill -9 进程号


练习:
1.查看sleep进程的进程号
pgrep sleep
进程号 3120
2.通过pkill或者kill命令杀掉sleep进程
kill -9 3120
pkill -9 sleep

SUID/SGID

SUID测试

// 测试普通用户在执行具有suid权限的程序后,能否具有此程序的属主权限
[root@zbx ~]# cp -p /usr/bin/vim /usr/bin/.vim // -p 复制权限
[root@zbx ~]# ls -l /usr/bin/vim /usr/bin/.vim
-rwxr-xr-x. 1 root root 3222024  321  2022 /usr/bin/.vim
-rwxr-xr-x. 1 root root 3222024  321  2022 /usr/bin/vim
[root@zbx ~]#
[root@zbx ~]# chmod u+s /usr/bin/.vim  // 给.vim 程序添加SUID权限
[root@zbx ~]#
[root@zbx ~]# ls -l /usr/bin/vim /usr/bin/.vim
-rw s r-xr-x. 1 root root 3222024  321  2022 /usr/bin/.vim
-rwxr-xr-x. 1 root root 3222024  321  2022 /usr/bin/vim
[root@zbx ~]# useradd student
[root@zbx ~]# su - student
[student@zbx ~]$ ls -l /usr/bin/vim /usr/bin/.vim
-rw s r-xr-x. 1 root root 3222024  321  2022 /usr/bin/.vim
-rwxr-xr-x. 1 root root 3222024  321  2022 /usr/bin/vim

[student@zbx ~]$ vim /home/student/stu1.txt
[student@zbx ~]$ .vim /home/student/stu2.txt

[student@zbx ~]$ ls -l /home/student/stu1.txt /home/student/stu2.txt


// 查看发现,虽然使用的是用户student进行的文档创建,但是stu2.txt属主变成了root


[root@zbx ~]# find /usr/bin/ -perm -u=s -type f // 查找/usr/bin目录下所有具有SUID的程序文件

// 查找/run目录下属组具有s特权(SGID)的目录
[root@zbx ~]# find /run -perm -g=s -type d

SGID测试

// 测试在不具有SGID的目录下创建文档时,与具有SGID的目录下创建文档时,所创建文档属组的区别

[root@zbx ~]# mkdir -m ug=rwx,o=rx /public  // -m : 在创建目录的同时设置权限
[root@zbx ~]# ls -ld /public/
drwxrwxr-x. 2 root root 4096  423 16:00 /public/
[root@zbx ~]# useradd zhangsan
[root@zbx ~]# chown :zhangsan /public/
[root@zbx ~]# ls -ld /public/
drwxrwxr-x. 2 root zhangsan 4096  423 16:00 /public/
[root@zbx ~]#
[root@zbx ~]# touch /public/root1.txt
[root@zbx ~]#
[root@zbx ~]# chmod g+s /public/
[root@zbx ~]#
[root@zbx ~]# ls -ld /public/
drwxrwsr-x. 2 root users 4096  423 16:03 /public/
[root@zbx ~]#
[root@zbx ~]# touch /public/root2.txt
[root@zbx ~]#
[root@zbx ~]# ls -l /public/*.txt
-rw-------. 1 root  root   0  4月 23 16:03 /public/root1.txt
-rw-------. 1 root  zhangsan  0  4月 23 16:05 /public/root2.txt

粘滞位测试

在一个其他人有w权限的目录中,如果该目录有粘滞位的特殊权限,自己只能删自己创建的,不能删除其他人的文件。
// 测试添加了t权限的目录,用户是否还可以操作其他用户的文档
[root@zbx ~]# useradd student

// /home/student : student的家目录
// ~ :家目录,如果~后面什么都不跟,代表的是当前用户的家目录
// ~用户名 : 用户对应的家目录
[root@zbx ~]# touch ~student/root.txt
[root@zbx ~]# su - student
[student@zbx ~]$ ls -ld ~student
drwx------ 2 student student 4096  61 22:44 /home/student/

[student@zbx ~]$ rm -rf ~student/root.txt
[student@zbx ~]
// 可以删除,因为student用户对/home/student目录具有w权限,所以可以对目录下的文件进行删除

[student@zbx ~] exit
[root@zbx ~]# ls -ld /tmp/
drwxrwxrw t . 12 root root 240  423 15:50 /tmp/

[root@zbx ~]# touch /tmp/root.txt

[root@zbx ~]# su - student

[student@zbx ~]$
[student@zbx ~]$ rm -rf /tmp/root.txt
// rm: 无法删除 '/tmp/root.txt': 不允许的操作

ACL访问控制

查看ACL(Access Control List访问控制列表)策略

// ACL:Access Control List 访问控制列表
// -p :以原始格式显示 ACL

[root@zbx ~]# getfacl /root/  // 查看ACL策略
# file: /root/
# owner: root
# group: root
user::r-x
group::r-x
other::---

设置ACL策略

// set : 设置
// get : 获取
// f : file 文档
// -m : modify 修改文件的ACL
// -b : 表示删除所有的 ACL
// mask: 限制其他用户和用户组的权限上限


[root@zbx ~]#  ls -ld /root 
dr-xr-x---. 5 root root 4096  423 14:54 /root
[root@zbx ~]#
[root@zbx ~]#  setfacl -m u:student:rw /root/   // 给student用户单独设置rw权限
[root@zbx ~]#
[root@zbx ~]#  getfacl -p /root/ 
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rw-
group::r-x
mask::rwx
other::---
[root@zbx ~]#  su - student 
[student@zbx ~]$  touch /root/a.txt    // 提示权限不够(因为创建文件需要w+x权限)
touch: 无法创建 '/root/a.txt': 权限不够

[student@zbx ~]$  getfacl -p /root/ 
# file: /root/
# owner: root
# group: root
user::r-x
 user:student:rw-    // 没有执行权限,只有w权限也创建不了(创建文件需要w+x权限)
group::r-x
mask::rwx
other::---

[student@zbx ~]$  exit 
注销
[root@zbx ~]#  setfacl -m u:student:rwx /root/   // 添加执行权限
[root@zbx ~]#  getfacl -p /root/ 
# file: /root/
# owner: root
# group: root
user::r-x
 user:student:rwx 
group::r-x
mask::rwx
other::---

[root@zbx ~]#  su - student 
[student@zbx ~]$  touch /root/a.txt   // 可以成功创建 

// getfacl -c : -c 代表在显示内容时不显示注释头
[student@zbx ~]$  getfacl -pc /root/ 
user::r-x
user:student:rwx
group::r-x
mask::rwx
other::---

删除ACL策略

[root@zbx ~]#  getfacl -p /root/ 
# file: /root/
# owner: root
# group: root
user::r-x
user:student:rwx
group::r-x
mask::rwx
other::---

[root@zbx ~]#  setfacl -x u:student /root/   //删除acl策略
[root@zbx ~]#  getfacl -p /root/ 
# file: /root/
# owner: root
# group: root
user::r-x
group::r-x
mask::r-x
other::---

Linux系统安全加固

禁止root用户ssh远程登录

[root@zbx ~]# useradd student
[root@zbx ~]# echo "123456" | passwd --stdin student

[root@zbx ~]# vim /etc/ssh/sshd_config

PermitRootLogin no  // 原yes改为no,禁止root远程登录

[root@zbx ~]# systemctl restart sshd  //重启sshd服务,生效
测试:
C:\Users\tedu> ssh root@192.168.10.223  // 拒绝
C:\Users\tedu> ssh student@192.168.10.223  //成功

仅允许某些用户在某些主机上远程连接

[root@zbx ~]# useradd zhangsan
[root@zbx ~]# echo "123456" | passwd --stdin zhangsan
[root@zbx ~]# useradd wangwu
[root@zbx ~]# echo "123456" | passwd --stdin wangwu

[root@zbx ~]# vim /etc/ssh/sshd_config
// 新增
AllowUsers zhangsan@192.168.10.1 wangwu@192.168.10.1 
// 只允许zhangsan和wangwu用户通过10.1的主机来连接我
// allow : 允许
// users : 用户

[root@zbx ~]# systemctl restart sshd
测试:
[root@zbx ~]# useradd zhangsan
[root@zbx ~]# passwd zhangsan
C:\Users\tedu>ssh student@192.168.10.223   // 拒绝
C:\Users\tedu>ssh zhangsan@192.168.10.223  //成功
做完之后,恢复原状
[root@zbx ~]# vim /etc/ssh/sshd_config
# AllowUsers zhangsan@192.168.10.1 wangwu@192.168.10.1 
[root@zbx ~]# systemctl restart sshd

命令行超时退出

[root@zbx ~]# vim /etc/profile  //修改此文件,对所有后续登录有效

export TMOUT=30   //设置超时时间300秒,测试时可以设置为30秒

// 重新建立Moba连接,测试超过30秒不做操作,就会自动断开连接

密码复杂性要求

设置密码长度、密码复杂性、密码历史等,防止黑客密码爆破
/* PAM: Pluggable Authentication Modules 可插拔身份验证模块
作用:
认证(Authentication):验证用户的身份。例如,通过比较用户提供的密码和系统中存储的密码进行认证。

账号管理(Account Management):检查用户的访问权限,例如检查用户是否在访问时间范围内,账户是否过期等。

密码管理(Password Management):负责密码的更新和管理。

会话管理(Session Management):进行登录后的各种初始化工作,例如记录登录信息、挂载用户的家目录等。
*/

  [root@zbx ~]#  vim /etc/pam.d/system-auth   //系统认证配置文件(一般做本地认证)

// 修改此行
password requisite pam_pwquality.so  minlen=8 minclass=3 retry=3 enforce_for_root 
// 添加此行
password required pam_pwhistory.so use_authtok  remember=5 enforce_for_root 

[root@zbx ~]#  vim /etc/pam.d/password-auth       //密码认证配置文件(一般做远程认证)
// 修改此行
password requisite pam_pwquality.so  minlen=8 minclass=3 retry=3 enforce_for_root 
// 添加此行
password required pam_pwhistory.so use_authtok  remember=5 enforce_for_root
测试:
[root@zbx ~]# passwd student
更改用户 student 的密码 。
新的密码:
无效的密码: 密码少于 8 个字符
新的密码:
无效的密码: 密码少于 8 个字符
新的密码:
无效的密码: 密码少于 8 个字符
passwd: 已经超出服务重试的最多次数

密码有效期

密码有效期信息包括密码的有效天数、允许修改密码的间隔天数、密码过期前的警告天数等
// 对所有用户都生效
[root@zbx ~]# vim /etc/login.defs

PASS_MAX_DAYS   99999   // 密码最长的使用天数
PASS_MIN_DAYS   0       // 密码最小的使用天数
PASS_MIN_LEN    5       // 密码最小长度
PASS_WARN_AGE   7       // 密码过期前警告天数
通过chage修改和查看密码有效期:
chage:用于更改用户账户和密码的过期信息
// 针对某一个用户的修改

[root@zbx ~]# chage --help  // 其他使用请参考帮助信息
[root@zbx ~]# chage  -M 30 root 
[root@zbx ~]# chage -l root
最近一次密码修改时间                                    :从不
密码过期时间                                    :从不
密码失效时间                                    :从不
帐户过期时间                                            :从不
两次改变密码之间相距的最小天数          :0
两次改变密码之间相距的最大天数          :30
在密码过期之前警告的天数        :7

登错锁定时间

登录时输错密码达3次,将会被锁定禁止再登录。延长锁定时间,可以提高密码的安全性,防止被人恶意猜测。
[root@zbx ~]# vim /etc/pam.d/system-auth

auth        required      pam_faillock.so preauth audit  deny=3 unlock_time=900 even_deny_root  
auth        [default=die] pam_faillock.so authfail audit  deny=3 unlock_time=900 even_deny_root  
auth        sufficient    pam_faillock.so authsucc audit  deny=3 unlock_time=900 even_deny_root 


[root@zbx ~]# vim /etc/pam.d/password-auth      //密码认证配置文件(一般做远程认证)

auth        required      pam_faillock.so preauth audit  deny=3 unlock_time=900 even_deny_root  
auth        [default=die] pam_faillock.so authfail audit  deny=3 unlock_time=900 even_deny_root  
auth        sufficient    pam_faillock.so authsucc audit  deny=3 unlock_time=900 even_deny_root 

/*

preauth行是在用户提供密码之前运行的,用于检查用户是否已经因为过去的失败尝试而被锁定。
authfail行是在用户提供了无效密码之后运行的,用于增加失败尝试的计数器。
authsucc行是在用户成功认证之后运行的,用于重置失败尝试的计数器

deny=3 表示如果一个用户在一段时间内连续认证失败3次,那么该用户账户将被锁定。

unlock_time=900 是一个参数,表示锁定的用户账户在多少秒后将被自动解锁。在这个例子中,用户账户将在900秒(即15分钟)后自动解锁。

even_deny_root 表示这个规则甚至对 root 用户也有效。也就是说,如果 root 用户连续3次登录失败,那么 root 用户也会被锁定 900 秒。

required:这意味着此模块必须成功执行。如果此模块失败,那么即使其他模块成功,整个认证过程也会在所有模块执行完后被标记为失败。然而,即使这个模块失败,其他模块还会继续执行。

[default=die]:这是一个更复杂的选项,其中"die"是对模块失败的处理方式。如果模块失败,那么不会执行后面的任何模块,整个认证过程立即结束,并返回失败。这在你希望一旦某个关键模块失败就立即停止认证的场景中非常有用。

sufficient:如果此模块成功,并且到目前为止没有其他模块失败,那么整个认证过程被标记为成功,并且跳过剩余的模块。如果此模块失败,那么PAM会忽略这个失败,继续执行后续的模块。

举个例子,你可能希望首先执行一个检查用户密码的模块,标记为 required,然后执行一个检查一次性密码(如OTP)的模块,标记为 sufficient。这样,如果用户提供了正确的一次性密码,那么他们可以跳过其他认证步骤。然后,你可能有一个检查是否是在工作时间登录的模块,如果标记为 [default=die],那么如果这个模块检查失败(也就是说,用户在非工作时间尝试登录),那么整个认证过程立即失败,不再执行任何其他模块。

由于实验做到目前为止,不同主机的配置可能会有一些区别,所以下面是/etc/pam.d/system-auth和/etc/pam.d/password-auth的全部配置:

/etc/pam.d/system-auth:
auth        required      pam_env.so
auth        required      pam_faillock.so preauth audit  deny=3 even_deny_root unlock_time=60 
-auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
-auth        sufficient    pam_sss.so use_first_pass
auth        [default=die] pam_faillock.so authfail audit  deny=3 even_deny_root unlock_time=60 
auth        sufficient    pam_faillock.so authsucc audit  deny=3 even_deny_root unlock_time=60 
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     required      pam_faillock.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
-account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
-password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
-session     optional      pam_sss.so

/etc/pam.d/password-auth:
auth        required      pam_env.so
auth        required      pam_faillock.so preauth audit  deny=3 even_deny_root unlock_time=60 
-auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
-auth        sufficient    pam_sss.so use_first_pass
auth        [default=die] pam_faillock.so authfail audit  deny=3 even_deny_root unlock_time=60 
auth        sufficient    pam_faillock.so authsucc audit  deny=3 even_deny_root unlock_time=60 
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
-account     [default=bad success=ok user_unknown=ignore] pam_sss.so
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
-password    sufficient    pam_sss.so use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so
-session     optional      pam_sss.so


windows cmd测试(moba会存在一些自己的密码认证机制,效果会产生误差):
C:\Users\tedu>ssh student@192.168.10.223

Authorized users only. All activities may be monitored and reported.
student@192.168.10.223's password:
Connection closed by 192.168.10.223 port 22    // 3次 锁定

回顾:
1.su : 切换用户
su - 用户名 :切换用户时进入到用户的家目录
如果想要让一个用户能够使用su命令
openEuler对su做了限制,只有加入到wheel组
当中的用户才能够使用su
1.gpasswd -a 用户 wheel
2.#注释配置文件中wheel组限制(所有用户都可以随意su切换)

su产生的日志:
/var/log/secure(搜索:su-l)

sudo : super doing  以超级用户身份执行命令
编辑sudo授权表:
visudo
用户   主机=(身份)  命令

查看自身sudo权限:
sudo -l

开启日志记录:
visudo

Defaults logfile=日志存放的位置

检查防火墙是否关闭
systemctl is-active firewalld
systemctl status firewalld

设置防火墙禁止开机自启
systemctl disable --now firewalld

检查软件源:
 ls /etc/yum.repos.d/

如果有两个.repo文件代表软件源设置成功

检查软件来源检测是否被关闭:
vim /etc/yum.conf

gpgcheck=0


关闭SELINUX
获取SELINUX状态:getenforce
设置SELINUX状态(临时):
setenforce 0

设置SELINUX状态(长期):
vim /etc/selinux/config
修改第7SELINUX=disabled



回顾:
1.查找命令对应的程序
which 命令

2.find:文件查找
查找文件名:  find  查找的位置 -name "文件名"

查找文档类型:find /  -type d | f | l
f:普通文件
d:目录
l:链接

size:尺寸,大小
查找文档大小: fin / -size +30M -type f


mtime : m modify 修改  time 时间
查找文档修改时间: find / -mtime +30 -type f

查找权限相关的文档:
find / -perm -ugo=rwx -type f



回顾:
1.查看进程树:pstree
2.实时进程状态:top
3.查询进程对应的进程号:pgrep 进程名
4.(终止)进程:
pkill -9 进程名称
kill -9 进程号

SUID:属主的s特权
如果一个程序属主具有s特权
用户执行这个程序的时候就会暂时拥有属主的
身份/权限

SGID:属组的s特权
拥有属组s特权的目录
用户在这个目录下创建文档,这个文档的属组
就是这个目录的属组

粘滞位:其他用户的t权限
如果一个目录拥有其他用户的t权限
用户在这个目录下进行操作的时候
只能操作自己的文档,不能操作其他人文档

ACL:访问控制列表
1.获取acl策略:getfacl 
2.设置acl策略:setfacl
3.删除acl
setfacl -x 删除一条acl
setfacl -b 清除所有的acl

Linux中典型加固措施:
1.禁用root用户远程登录
vim /etc/ssh/sshd_config

PermitRootLogin no

重启服务才能生效:systemctl restart sshd

"白名单":只允许某些用户在规定的主机上进行
ssh远程连接
vim /etc/ssh/sshd_config
AllowUsers 用户1@主机地址1 用户2@主机地址2

重启服务才能生效:systemctl restart sshd